home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / slperl.zoo / atarist / atarist.c next >
C/C++ Source or Header  |  1992-07-02  |  6KB  |  283 lines

  1. /*
  2.  * random stuff for atariST
  3.  */
  4.  
  5. #include "EXTERN.h"
  6. #include "perl.h"
  7.  
  8. /* call back stuff, atari specific stuff below */
  9. /* Be sure to refetch the stack pointer after calling these routines. */
  10.  
  11. int
  12. callback(subname, sp, gimme, hasargs, numargs)
  13. char *subname;
  14. int sp;            /* stack pointer after args are pushed */
  15. int gimme;        /* called in array or scalar context */
  16. int hasargs;        /* whether to create a @_ array for routine */
  17. int numargs;        /* how many args are pushed on the stack */
  18. {
  19.     static ARG myarg[3];    /* fake syntax tree node */
  20.     int arglast[3];
  21.     
  22.     arglast[2] = sp;
  23.     sp -= numargs;
  24.     arglast[1] = sp--;
  25.     arglast[0] = sp;
  26.  
  27.     if (!myarg[0].arg_ptr.arg_str)
  28.     myarg[0].arg_ptr.arg_str = str_make("",0);
  29.  
  30.     myarg[1].arg_type = A_WORD;
  31.     myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE);
  32.  
  33.     myarg[2].arg_type = hasargs ? A_EXPR : A_NULL;
  34.  
  35.     return do_subr(myarg, gimme, arglast);
  36. }
  37.  
  38. int
  39. callv(subname, sp, gimme, argv)
  40. char *subname;
  41. register int sp;    /* current stack pointer */
  42. int gimme;        /* called in array or scalar context */
  43. register char **argv;    /* null terminated arg list, NULL for no arglist */
  44. {
  45.     register int items = 0;
  46.     int hasargs = (argv != 0);
  47.  
  48.     astore(stack, ++sp, Nullstr);    /* reserve spot for 1st return arg */
  49.     if (hasargs) {
  50.     while (*argv) {
  51.         astore(stack, ++sp, str_2mortal(str_make(*argv,0)));
  52.         items++;
  53.         argv++;
  54.     }
  55.     }
  56.     return callback(subname, sp, gimme, hasargs, items);
  57. }
  58.  
  59. #include <process.h>
  60. #include <stdio.h>
  61.  
  62. long _stksize = 64*1024L;
  63. unsigned long __DEFAULT_BUFSIZ__ = 4 * 1024L;
  64.  
  65. /*
  66.  * The following code is based on the do_exec and do_aexec functions
  67.  * in file doio.c
  68.  */
  69. int
  70. do_aspawn(really,arglast)
  71. STR *really;
  72. int *arglast;
  73. {
  74.     register STR **st = stack->ary_array;
  75.     register int sp = arglast[1];
  76.     register int items = arglast[2] - sp;
  77.     register char **a;
  78.     char **argv;
  79.     char *tmps;
  80.     int status;
  81.  
  82.     if (items) {
  83.     New(1101,argv, items+1, char*);
  84.     a = argv;
  85.     for (st += ++sp; items > 0; items--,st++) {
  86.         if (*st)
  87.         *a++ = str_get(*st);
  88.         else
  89.         *a++ = "";
  90.     }
  91.     *a = Nullch;
  92.     if (really && *(tmps = str_get(really)))
  93.         status = spawnvp(-P_WAIT,tmps,argv); /* -P_WAIT is a hack, see spawnvp.c in the lib */
  94.     else
  95.         status = spawnvp(-P_WAIT,argv[0],argv);
  96.     Safefree(argv);
  97.     }
  98.     return status;
  99. }
  100.  
  101.  
  102. int
  103. do_spawn(cmd)
  104. char *cmd;
  105. {
  106.     return system(cmd);
  107. }
  108.  
  109. #if 0 /* patchlevel 79 onwards we can */
  110. /*
  111.  * we unfortunately cannot use the super efficient fread/write from the lib
  112.  */
  113. size_t fread(void *data, size_t size, size_t count, FILE *fp)
  114. {
  115.     size_t i, j;
  116.     unsigned char *buf = (unsigned char *)data;
  117.     int c;
  118.  
  119.     for(i = 0; i < count; i++)
  120.     {
  121.     for(j = 0; j < size; j++)
  122.     {
  123.         if((c = getc(fp)) == EOF)
  124.            return 0;
  125.         *buf++ = c;
  126.         }
  127.     }
  128.     return i;
  129. }
  130.  
  131. size_t fwrite(const void *data, size_t size, size_t count, FILE *fp)
  132. {
  133.     size_t i, j;
  134.     const unsigned char *buf = (const unsigned char *)data;
  135.  
  136.     for(i = 0; i < count; i++)
  137.     {
  138.     for(j = 0; j < size; j++)
  139.     {
  140.         if(fputc(*buf++, fp) == EOF)
  141.            return 0;
  142.         }
  143.     }
  144.     return i;
  145. }
  146. #endif
  147.  
  148. #ifdef HAS_SYSCALL
  149. #define __NO_INLINE__
  150. #include <osbind.h> /* must include this for proper protos */
  151.  
  152. /* these must match osbind.pl */
  153. #define TRAP_1_W        1
  154. #define TRAP_1_WW        2
  155. #define TRAP_1_WL        3
  156. #define TRAP_1_WLW        4
  157. #define TRAP_1_WWW        5
  158. #define TRAP_1_WLL        6
  159. #define TRAP_1_WWLL        7
  160. #define TRAP_1_WLWW        8
  161. #define TRAP_1_WWLLL        9
  162. #define TRAP_13_W        10
  163. #define TRAP_13_WW        11
  164. #define TRAP_13_WL        12
  165. #define TRAP_13_WWW        13
  166. #define TRAP_13_WWL        14
  167. #define TRAP_13_WWLWWW        15
  168. #define TRAP_14_W        16
  169. #define TRAP_14_WW        17
  170. #define TRAP_14_WL        18
  171. #define TRAP_14_WWW        19
  172. #define TRAP_14_WWL        20
  173. #define TRAP_14_WWLL        21
  174. #define TRAP_14_WLLW        22
  175. #define TRAP_14_WLLL        23
  176. #define TRAP_14_WWWL        24
  177. #define TRAP_14_WWWWL        25
  178. #define TRAP_14_WLLWW        26
  179. #define TRAP_14_WWWWWWW        27
  180. #define TRAP_14_WLLWWWWW    28
  181. #define TRAP_14_WLLWWWWLW    29
  182. #define TRAP_14_WLLWWWWWLW    30
  183.  
  184. int syscall(trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )
  185. unsigned long trap, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
  186. {
  187.   /* for now */
  188.   switch(trap)
  189.   {
  190.     case TRAP_1_W:
  191.       return trap_1_w(fn);
  192.       
  193.     case TRAP_1_WW:
  194.       return trap_1_ww(fn, a1);
  195.       
  196.     case TRAP_1_WL:
  197.       return trap_1_wl(fn, a1);
  198.       
  199.     case TRAP_1_WLW:
  200.       return trap_1_wlw(fn, a1, a2);
  201.       
  202.     case TRAP_1_WWW:
  203.       return trap_1_www(fn, a1, a2);
  204.       
  205.     case TRAP_1_WLL:
  206.       return trap_1_wll(fn, a1, a2);
  207.       
  208.     case TRAP_1_WWLL:
  209.       return trap_1_wwll(fn, a1, a2, a3);
  210.       
  211.     case TRAP_1_WLWW:
  212.       return trap_1_wlww(fn, a1, a2, a3);
  213.       
  214.     case TRAP_1_WWLLL:
  215.       return trap_1_wwlll(fn, a1, a2, a3, a4);
  216.       
  217.     case TRAP_13_W:
  218.       return trap_13_w(fn);
  219.       
  220.     case TRAP_13_WW:
  221.       return trap_13_ww(fn, a1);
  222.       
  223.     case TRAP_13_WL:
  224.       return trap_13_wl(fn, a1);
  225.       
  226.     case TRAP_13_WWW:
  227.       return trap_13_www(fn, a1, a2);
  228.       
  229.     case TRAP_13_WWL:
  230.       return trap_13_wwl(fn, a1, a2);
  231.       
  232.     case TRAP_13_WWLWWW:
  233.       return trap_13_wwlwww(fn, a1, a2, a3, a4, a5);
  234.       
  235.     case TRAP_14_W:
  236.       return trap_14_w(fn);
  237.       
  238.     case TRAP_14_WW:
  239.       return trap_14_ww(fn, a1);
  240.       
  241.     case TRAP_14_WL:
  242.       return trap_14_wl(fn, a1);
  243.       
  244.     case TRAP_14_WWW:
  245.       return trap_14_www(fn, a1, a2);
  246.       
  247.     case TRAP_14_WWL:
  248.       return trap_14_wwl(fn, a1, a2);
  249.       
  250.     case TRAP_14_WWLL:
  251.       return trap_14_wwll(fn, a1, a2, a3);
  252.       
  253.     case TRAP_14_WLLW:
  254.       return trap_14_wllw(fn, a1, a2, a3);
  255.       
  256.     case TRAP_14_WLLL:
  257.       return trap_14_wlll(fn, a1, a2, a3);
  258.       
  259.     case TRAP_14_WWWL:
  260.       return trap_14_wwwl(fn, a1, a2, a3);
  261.       
  262.     case TRAP_14_WWWWL:
  263.       return trap_14_wwwwl(fn, a1, a2, a3, a4);
  264.       
  265.     case TRAP_14_WLLWW:
  266.       return trap_14_wllww(fn, a1, a2, a3, a4);
  267.       
  268.     case TRAP_14_WWWWWWW:
  269.       return trap_14_wwwwwww(fn, a1, a2, a3, a4, a5, a6);
  270.       
  271.     case TRAP_14_WLLWWWWW:
  272.       return trap_14_wllwwwww(fn, a1, a2, a3, a4, a5, a6, a7);
  273.       
  274.     case TRAP_14_WLLWWWWLW:
  275.       return trap_14_wllwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8);
  276.       
  277.     case TRAP_14_WLLWWWWWLW:
  278.       return trap_14_wllwwwwwlw(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  279.   }      
  280. }
  281. #endif
  282.  
  283.